home *** CD-ROM | disk | FTP | other *** search
/ Hottest 6 / Hottest 6 (1996)(PDSoft)[!].iso / software / programming / c / sipp / include / geometric.h < prev    next >
C/C++ Source or Header  |  1978-11-24  |  5KB  |  154 lines

  1. /**
  2.  ** sipp - SImple Polygon Processor
  3.  **
  4.  **  A general 3d graphic package
  5.  **
  6.  **  Copyright Equivalent Software HB  1992
  7.  **
  8.  ** This program is free software; you can redistribute it and/or modify
  9.  ** it under the terms of the GNU General Public License as published by
  10.  ** the Free Software Foundation; either version 1, or any later version.
  11.  ** This program is distributed in the hope that it will be useful,
  12.  ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  ** GNU General Public License for more details.
  15.  ** You can receive a copy of the GNU General Public License from the
  16.  ** Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  **/
  18.  
  19. /**
  20.  ** geometric.h - All kinds of stuff with matrixes, transformations, 
  21.  **               coordinates
  22.  **/
  23.  
  24. /* Make sure no multiple including */
  25. #ifndef _GEOMETRIC_H_
  26. #define _GEOMETRIC_H_
  27.  
  28. #include <math.h>
  29. #ifndef NOMEMCPY
  30. #include <memory.h>
  31. #endif
  32.  
  33.  
  34. /* #define PI    3.1415926535897932384626 */
  35.  
  36.  
  37. typedef struct {
  38.     double x, y, z;
  39. } Vector;
  40.  
  41.  
  42. /*
  43.  * NOTE:
  44.  * Capitalized types denote Vectors and other aggregates.
  45.  * Lower case denote scalars.
  46.  */
  47.  
  48. /* V = Vec(x, y, z) */
  49. #define MakeVector(V, xx, yy, zz)  { (V).x=(xx); \
  50.                                      (V).y=(yy); \
  51.                                      (V).z=(zz); }
  52.  
  53. /* A = -A */
  54. #define VecNegate(A)             { (A).x=0-(A).x; \
  55.                        (A).y=0-(A).y; \
  56.                        (A).z=0-(A).z; }
  57.  
  58. /* return A . B */
  59. #define VecDot(A, B)    ((A).x*(B).x+(A).y*(B).y+(A).z*(B).z)
  60.  
  61. /* return length(A) */
  62. #define VecLen(A)    (sqrt((double)VecDot(A, A)))
  63.  
  64. /* B = A */
  65. #define VecCopy(B, A)    ((B) = (A))
  66.  
  67. /* C = A + B */
  68. #define VecAdd(C, A, B)     { (C).x=(A).x+(B).x; \
  69.                (C).y=(A).y+(B).y; \
  70.                (C).z=(A).z+(B).z; }
  71.  
  72. /* C = A - B */
  73. #define VecSub(C, A, B)     { (C).x=(A).x-(B).x; \
  74.                (C).y=(A).y-(B).y; \
  75.                (C).z=(A).z-(B).z; }
  76.  
  77. /* C = a*A */
  78. #define VecScalMul(C, a, A)     { (C).x=(a)*(A).x; \
  79.                    (C).y=(a)*(A).y; \
  80.                    (C).z=(a)*(A).z; }
  81.  
  82. /* C = a*A + B */
  83. #define VecAddS(C, a, A, B)     { (C).x=(a)*(A).x+(B).x; \
  84.                    (C).y=(a)*(A).y+(B).y; \
  85.                    (C).z=(a)*(A).z+(B).z; }
  86.  
  87. /* C = a*A + b*B */
  88. #define VecComb(C, a, A, b, B)     { (C).x=(a)*(A).x+(b)*(B).x; \
  89.                    (C).y=(a)*(A).y+(b)*(B).y; \
  90.                     (C).z=(a)*(A).z+(b)*(B).z; }
  91.  
  92. /* C = A X B */
  93. #define VecCross(C, A, B)        { (C).x=(A).y*(B).z-(A).z*(B).y; \
  94.                                    (C).y=(A).z*(B).x-(A).x*(B).z; \
  95.                        (C).z=(A).x*(B).y-(A).y*(B).x; }
  96.  
  97.  
  98. #define VecMax(C, A, B)             { (C).x=(((A).x>(B).x)?(A).x:(B).x); \
  99.                                    (C).y=(((A).y>(B).y)?(A).y:(B).y); \
  100.                                    (C).z=(((A).z>(B).z)?(A).z:(B).z); }
  101.  
  102.  
  103. #define VecMin(C, A, B)             { (C).x=(((A).x<(B).x)?(A).x:(B).x); \
  104.                                    (C).y=(((A).y<(B).y)?(A).y:(B).y); \
  105.                                    (C).z=(((A).z<(B).z)?(A).z:(B).z); }
  106.  
  107. /* ================================================================ */
  108. /*                         Matrix operations                        */
  109.  
  110.  
  111. /*
  112.  * Define a homogenous transformation matrix. The first row (vector) 
  113.  * is the new X axis, i.e. the X axis in the transformed coordinate 
  114.  * system. The second row is the new Y axis, and so on. The last row
  115.  * is the translation, for a transformed point.
  116.  *
  117.  * The reason we make surround the rows with a struct is that we
  118.  * don't want to say (Transf_mat *) &foo[0] instead of &foo when
  119.  * sending an address to a matrix as a parameter to a function.
  120.  * Alas, arrays are not first class objects in C.
  121.  */
  122.  
  123. typedef struct {
  124.     double   mat[4][3];
  125. } Transf_mat;
  126.  
  127.  
  128. extern Transf_mat   ident_matrix;
  129.  
  130.  
  131. /* *A = *B    N.b. A and B are pointers! */
  132. #define MatCopy(A, B)         (*A) = (*B)
  133.  
  134.  
  135. /*----------------------------------------------------------------------*/
  136.  
  137.  
  138. /* Function declarations for the functions in geometric.c */
  139.  
  140. extern void          vecnorm(/* Vector */); /* Normalize a vector */
  141. extern Transf_mat  * transf_mat_create(/* Matrix * */);
  142. extern void          mat_translate(/* Matrix *, double, double, double */);
  143. extern void          mat_rotate_x(/* Matrix *, double */);
  144. extern void          mat_rotate_y(/* Matrix *, double */);
  145. extern void          mat_rotate_z(/* Matrix *, double */);
  146. extern void          mat_rotate(/* Matrix *, Vector *, Vector *, double */);
  147. extern void          mat_scale(/* Matrix *, double, double, double */);
  148. extern void          mat_mirror_plane(/* Matrix *, Vector *, Vector * */);
  149. extern void          mat_mul(/* Matrix *, Matrix *, Matrix * */);
  150. extern void          point_transform(/* Vector *, Vector *, Matrix * */);
  151.  
  152.  
  153. #endif  /* _GEOMETRIC_H_ */
  154.